package com.example.demo.service;

import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.QueryBuilder;

import java.util.List;
import java.util.Map;

public interface TransportService {

    /**
     * 创建Json字符串格式的索引
     * @param index
     * @param type
     * @param json
     */
    void addIndex(String index ,String type ,String json);

    /**
     * 创建Map类型的索引
     * @param index
     * @param type
     * @param map
     */
    void addIndex(String index , String type , Map<String,Object> map);


    /**
     * 序列化Bean的方式创建索引
     * @param index
     * @param type
     * @param object
     */
    void addIndex(String index , String type , Object object);

    /**
     * 使用Elasticsearch XContentBuilder 创建索引
     * @param index
     * @param type
     * @param builder
     */
    void addIndex(String index , String type , XContentBuilder builder);

    void addIndex(String index);

    IndexResponse getIndexResponse(String index ,String type ,XContentBuilder builder);

    /**
     * 打印索引信息
     * @param response
     */
    void printIndexInfo(IndexResponse response);


    /**
     * 创减IK索引
     * @param index
     * @param type
     * @param builder
     */
    void addIndexByIK(String index ,String type , XContentBuilder builder);

    /**
     * 删除指定id的索引
     * @param index
     * @param type
     * @param id
     */
    void deleteIndex(String index, String type, String id);

    /**
     * 删除指定indexName的索引及该索引下所有内容
     * @param index
     */
    void deleteIndex(String index);

    /**
     * 获取文档相当于读取数据库的一行数据
     * @param index
     * @param type
     * @param id
     */
    void getIndex(String index , String type , String id);

    /**
     * 通过对象插入数据到索引中（索引id不用指定）
     * @param index
     * @param type
     * @param object
     */
    void insertByObject(String index,String type,Object object);

    /**
     * 单个对象插入索引指定位置（有则更新，无则增加）
     * @param index
     * @param type
     * @param id
     * @param object
     */
    void insertByObject(String index,String type,String id ,Object object);

    /**
     * 批量插入
     * @param index
     * @param type
     * @param objects
     */
    void batchInsert(String index, String type, List<?> objects);

    /**
     * 批量插入
     * @param index
     * @param type
     * @param id
     * @param objects
     */
    void batchInsert(String index, String type, String id , List<?> objects);

    /**
     * 批量map集合插入
     * @param index
     * @param type
     * @param map
     */
    void batchInsert(String index, String type,Map<String ,Object> map);

    /**
     *批量插入map
     * @param index
     * @param type
     * @param id
     * @param map
     */
    void batchInsert(String index, String type,String id, Map<String ,Object> map);

    /**
     * 更新指定文档的值（该id的文档就是传入的数据，相当于删除+插入操作。。。慎重慎重慎重）
     * @param index
     * @param type
     * @param id
     * @param object
     */
    void updateDocument(String index, String type,String id,Object object);


    /**
     * 查询该索引改type下的所有数据
     * @param index
     * @param type
     */
    SearchResponse getMatchAll(String index , String type );

    /**
     * 打印输出该response里面的内容
     * @param searchResponse
     */
    void printSearchResponse(SearchResponse searchResponse);

    /**
     * 根据输入字段进行指定索引的查询
     * 只要含有该字段都显示（范围最广的查询）
     * @param index
     * @param type
     * @param terms
     * @return
     */
    SearchResponse queryStringQuery(String index , String type,String terms );

//    SearchResponse wildcardQuery(String index , String type,String terms );
//
//    SearchResponse termQuery(String index , String type,String terms );
//
//    SearchResponse combinationQuery(String index , String type,String terms );
//
//    SearchResponse query(String index , String type,String terms);
//
//    QueryBuilder queryByString(String terms);
//
//    SearchRequestBuilder getSearchRequestBuilder(String index,String type,QueryBuilder queryBuilder);
//
//    SearchResponse getSearchResponse(SearchRequestBuilder searchRequestBuilder);



}
